﻿using Programming.DemoProject.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Programming.DemoProject.AOP
{
    /// <summary>
    /// 面向切面编程AOP
    /// </summary>
    public class AOPShow
    {
        public static void Show()
        {
            {
                Console.WriteLine("用户注册，提交信息");
                //在面向对象语言开发时，程序的扩展性，80%以上都是靠抽象&多实现切换---23种设计模式---但是，这个切换是以对象为整体的！
                //我们能切换的，只是靠对象替换对象；但是同一个对象自身，是没有扩展的
                //MysqlDBHelper也只能来一个MysqlDBHelperV2的对象来替换之前的版本

                //有什么办法，可以既不修改对象，也不替换对象，还能扩展原有对象的功能？
                //这个就是AOP 面向切面编程---不破坏封装的前提下，去额外扩展功能

                UserInfo userInfo = new UserInfo()
                {
                    Account = "Administrator",
                    Name = "清光",
                    Password = "888888"
                };
                //IDBHelper dBHelper = SimpleFactory.CreateDBHelper();
                IDBHelper dBHelper = new DBHelperProxy(); //new MySQLDBHelper();

                dBHelper.Save(userInfo);
            }
            {
                //动态代理的
                DynamicProxy.Show();

                //可以动态的为各种类扩展功能，哇 很强大
                //1 更灵活的功能扩展，程序设计聚焦于业务逻辑
                //2 代码复用，方便维护和团队管理

                //AOP能做什么  AOP不能做什么？
                //几乎业务逻辑之外的东西，都可以靠AOP实现
                //AOP不能做业务逻辑，不能新增业务逻辑，只能扩展通用逻辑---
            }
        }
    }
}
